/*
 * Copyright 2016 jeasonlzy(廖子尧)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.equipment.net.callbck;

import android.util.Log;
import android.widget.Toast;

import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.SPUtils;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.request.base.Request;
import com.android.equipment.base.BaseApplication;
import com.android.equipment.ui.LoginActivity;
import com.android.equipment.utils.IsNull;
import com.android.equipment.utils.ToastUtil;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.SocketException;
import java.net.SocketTimeoutException;

import okhttp3.Response;

/**
 * ================================================
 * 作    者：jeasonlzy（廖子尧）Github地址：https://github.com/jeasonlzy
 * 版    本：1.0
 * 创建日期：2016/1/14
 * 描    述：默认将返回的数据解析成需要的Bean,可以是 BaseBean，String，List，Map
 * 修订历史：
 * ================================================
 */
public abstract class JsonCallback<T> extends AbsCallback<T> {

    private Type type;
    private Class<T> clazz;

    public JsonCallback() {
    }

    public JsonCallback(Type type) {
        this.type = type;
    }

    public JsonCallback(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public void onStart(Request<T, ? extends Request> request) {
        super.onStart(request);
        // 主要用于在所有请求之前添加公共的请求头或请求参数
        // 例如登录授权的 token
        // 使用的设备信息
        // 可以随意添加,也可以什么都不传
        // 还可以在这里对所有的参数进行加密，均在这里实现
//        request.headers("header1", "HeaderValue1")
//                .params("params1", "ParamsValue1")
//                .params("token", "3215sdf13ad1f65asd4f3ads1f");



    }

    /**
     * 该方法是子线程处理，不能做ui相关的工作
     * 主要作用是解析网络返回的 response 对象,生产onSuccess回调中需要的数据对象
     * 这里的解析工作不同的业务逻辑基本都不一样,所以需要自己实现,以下给出的时模板代码,实际使用根据需要修改
     */
    @Override
    public T convertResponse(Response response) throws Throwable {

        // 重要的事情说三遍，不同的业务，这里的代码逻辑都不一样，如果你不修改，那么基本不可用
        // 重要的事情说三遍，不同的业务，这里的代码逻辑都不一样，如果你不修改，那么基本不可用
        // 重要的事情说三遍，不同的业务，这里的代码逻辑都不一样，如果你不修改，那么基本不可用

        //详细自定义的原理和文档，看这里： https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback

        if (type == null) {
            if (clazz == null) {
                Type genType = getClass().getGenericSuperclass();
                type = ((ParameterizedType) genType).getActualTypeArguments()[0];
            } else {
                JsonConvert<T> convert = new JsonConvert<>(clazz);
                return convert.convertResponse(response);
            }
        }

//        Headers headers = response.headers();
//        LogUtils.e("headers=====" + headers);
//        String careuUpdate = headers.get("careuUpdate");
//        if (careuUpdate.equals("1")) {
//            String careuMust = headers.get("careuMust");
//            SPUtils.getInstance().put("token", careuMust);
//        }
        JsonConvert<T> convert = new JsonConvert<>(type);
        return convert.convertResponse(response);
    }

    @Override
    public void onError(com.lzy.okgo.model.Response<T> response) {
        super.onError(response);
        int code = response.code();
        String message = response.message();
        LogUtils.e("code====" + code);
        if (code == 404) {
            LogUtils.e("404 当前链接不存在");
            ToastUtil.showToastSafe("服务未找到,请稍后再试！");
        } else if (code == 500) {
            ToastUtil.showToastSafe("系统繁忙,请稍后尝试");
        } else if (code == 400) {
            ToastUtil.showToastSafe("业务繁忙,请稍后再试");
        } else if (code == 300){
            ToastUtil.showToastSafe("账号不存在或密码错误");
        } else if (code == 301){
            ToastUtil.showToastSafe("请重新登陆");
            //            ExitAlertDialog.show(ActivityUtils.getTopActivity(),
//                    R.style.dianfu_full_window_dialog, new String[]{"当前账户",
//                            "已在别的设备登录，已被迫下线！", "确认", ""},
//                    new ExitAlertDialog.BtnClickListener() {
//
//                        @Override
//                        public void btnOK() {
//                            SPUtils.getInstance().remove("token");
//                            ActivityUtils.startActivity(LoginActivity.class);
//                            ActivityUtils.finishAllActivities();
//                            ActivityManager.Logout();
//                        }
//
//                        @Override
//                        public void btnNO() {
//
//                        }
//                    }).show();
        }
        else {
            Throwable exception = response.getException();
            if (exception instanceof SocketTimeoutException) {
                Log.e("JsonCallback", "请求超时");
                ToastUtil.showToastSafe("请求超时,,请稍后再试！");
            } else if (exception instanceof SocketException) {
                Log.e("JsonCallback", "服务器异常");
                ToastUtil.showToastSafe("网络连接失败,请稍后再试！");
            } else if (exception instanceof NetException) { //个人自定义 异常 根据后台 约定值判断异常雷系
                BaseResponseBean errorBean = ((NetException) exception).getErrorBean();
                String msg = errorBean.msg;
                if (!IsNull.isNullOrEmpty(errorBean.code)) {
                    ToastUtil.showToastSafe("服务器异常,请稍后再试！");
                } else {
                    LogUtils.e("errorBean.code===" + errorBean.code);
                    Toast.makeText(BaseApplication.getContext(),msg, Toast.LENGTH_SHORT).show();
                    if (errorBean.code == 301){
                        SPUtils.getInstance().clear();
                        ActivityUtils.startActivity(LoginActivity.class);
                        ActivityUtils.finishAllActivities();
                        return;
                    }

                }
            } else {
                ToastUtil.showToastSafe(exception.getMessage() != null ? exception.getMessage() : "服务器异常");
            }
        }


    }

}
